package com.hitqz.robot.driver.util;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 科聪数据类型
 */
public enum   DataTypeEnum {

    UDINT("UDINT","32位无符号双整型"),

    REAL("REAL","32位浮点型"),

    INT("INT","32位整型"),

    BOOL("BOOL","布尔型")


    ;

    public final static Map<String, DataTypeEnum> MAP = new HashMap<>(20);
    //变量名和数据类型映射
    public final static Map<String, DataTypeEnum> VAR_NAME_ENUM_MAP = new HashMap<>(20);
    //存储需要定期查询的变量名
    public final static Set<String> VAR_NAME_SET = new HashSet<>(16);
    //存储不纯在的变量名
    public final static Set<String> UN_QUERY_VAR_NAME_SET = new HashSet<>(16);

    //这个enum的code的映射map
    static {
        for (DataTypeEnum e : DataTypeEnum.values()) {
            MAP.put(e.type, e);
        }
        VAR_NAME_ENUM_MAP.put("init_pose_cmd",INT);//重定位 设置1重置为充电房定位，重置完会自己恢复为0
        VAR_NAME_ENUM_MAP.put("cmd_forcedctrl",UDINT);//控制状态
        VAR_NAME_ENUM_MAP.put("cmd_vel_line_x",REAL);//x 线速度
        VAR_NAME_ENUM_MAP.put("cmd_vel_line_y",REAL);//y 线速度
        VAR_NAME_ENUM_MAP.put("cmd_vel_angle",REAL); //角速度
        VAR_NAME_ENUM_MAP.put("cmd_heartbeat",UDINT);//控制速度的心跳，没有则会强制速度置0
        VAR_NAME_ENUM_MAP.put("cmd_a_charge",INT);//无线充电命令 0-取消充电 1-开始充电
        VAR_NAME_ENUM_MAP.put("cmd_list_pos",REAL);//设置顶升高度 0-0.375m（制氢项目）
        VAR_NAME_ENUM_MAP.put("rep_m_charge",BOOL);//手动充电命令 0-空闲 1-充电中
        VAR_NAME_ENUM_MAP.put("rep_lyny_v",REAL);//充电电压
        VAR_NAME_ENUM_MAP.put("rep_lyny_i",REAL);//充电电流
        VAR_NAME_ENUM_MAP.put("rep_lyny_t",REAL);//设备温度
        VAR_NAME_ENUM_MAP.put("rep_lyny_rs",INT);//充电状态 0-未充电 1-充电段涓流 2-充电段恒流 3-充电段恒压
        VAR_NAME_ENUM_MAP.put("rep_lyny_e",INT);//故障码
        VAR_NAME_ENUM_MAP.put("rep_lyny_ss",INT); //系统状态 0-未充电 1-辅助对准 2-正在充电 3-关机中 4-保护中
        VAR_NAME_ENUM_MAP.put("rep_emergency_f",BOOL); //前防撞条触发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_emergency_b",BOOL); //后防撞条触发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_emergency_s",BOOL); //急停按钮触发情况 1触发
        VAR_NAME_ENUM_MAP.put("rep_motor_ok",BOOL); //电机初始化情况 1成功
        VAR_NAME_ENUM_MAP.put("rep_Cam_X",INT); //二维码X
        VAR_NAME_ENUM_MAP.put("rep_Cam_Y",INT); //二维码Y
        VAR_NAME_ENUM_MAP.put("rep_Cam_Z",REAL); //二维码Z
        VAR_NAME_ENUM_MAP.put("rep_lift_pos",REAL); //顶升高度
        VAR_NAME_ENUM_MAP.put("rep_BMS_Protect",UDINT); //机器人本体电池故障码

        //CVD项目
        VAR_NAME_ENUM_MAP.put("cmd_lift_set_mm",INT);//设置顶升距离，单位mm，行程10~480mm
        VAR_NAME_ENUM_MAP.put("cmd_lift_set_e",INT);//设置顶升到达允许误差，单位mm
        VAR_NAME_ENUM_MAP.put("rep_lift_get_mm",INT);//获取顶升距离，单位mm，行程10~480mm
        VAR_NAME_ENUM_MAP.put("rep_lift_stat",INT);//顶升状态 0：运动中，1：到达,2：故障
        VAR_NAME_ENUM_MAP.put("rep_lift_EC",INT);//顶升故障码
        VAR_NAME_ENUM_MAP.put("repCurPathPoint",UDINT);//当前路径点
        VAR_NAME_ENUM_MAP.put("repNaviStatus",INT);//当前导航状态--(混合/激光导航状态)
        VAR_NAME_ENUM_MAP.put("repNaviGoalID",UDINT);//当前目标点
        VAR_NAME_ENUM_MAP.put("repC3h10Si",INT);//三甲基硅烷 	ppm
        VAR_NAME_ENUM_MAP.put("repH2",INT);//氢气 ppm
        VAR_NAME_ENUM_MAP.put("repC3h6",INT);//丙烯 ppm
        VAR_NAME_ENUM_MAP.put("repTemp",INT);//温度 放大10倍
        VAR_NAME_ENUM_MAP.put("repHumidity",INT);//湿度 放大10倍

        // 需要定时查询的状态变量
        VAR_NAME_ENUM_MAP.keySet().stream().filter(
                // 排除掉不需要定时查询的变量
                name-> !name.contains("cmd")
        ).forEach(VAR_NAME_SET::add);

    }



    private final String type;
    private final String desc;

    DataTypeEnum(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }

    public String getType() {
        return type;
    }

    public String getDesc() {
        return desc;
    }
}
